var express = require('express');
var router = express.Router();

// 引入连接池对象
const sql = require('../db/index');
const Response = require('../utils/response');

// 获取课程种类
router.get('/findAll', async (req, res) => {
  const [response] = await sql.query('select * from course_category')
  console.log(response);

  res.send(new Response(200, '查询成功', response))
})

router.get('/pageQueryFind', async (req, res) => {
  // 从请求的查询字符串中获取参数
  const { status, teacherId, categoryId, name, page, pageSize } = req.query;
  // 计算分页的偏移量，用于SQL查询中的OFFSET
  const offset = (page - 1) * pageSize;

  // 初始化一个数组来存储构建SQL条件的片段
  const condition = [];
  // 初始化一个数组来存储与条件片段相对应的值
  const values = [];

  // 如果请求中包含status参数，则添加一个条件片段和对应的值
  if (status) {
    condition.push('course_table.status = ?');
    values.push(status);
  }
  // 如果请求中包含categoryId参数，则添加一个条件片段和对应的值
  if (categoryId) {
    condition.push('course_table.category_id = ?');
    values.push(categoryId);
  }
  // 如果请求中包含name参数，则添加一个条件片段和对应的值
  if (name) {
    condition.push('course_table.name LIKE ?');
    values.push(`%${name}%`);
  }
  // 如果请求中包含teacherId参数，则添加一个条件片段和对应的值
  if (teacherId) {
    condition.push('course_table.teacher_id = ?');
    values.push(teacherId);
  }

  // 根据条件片段数组的长度，构建完整的SQL条件字符串
  let sqlStr = condition.length ? `WHERE ${condition.join(' AND ')}` : '';
  // 打印构建的SQL条件字符串到控制台
  console.log(sqlStr);

  try {
    // 使用内连接（INNER JOIN）来联合course_category和base_user表，并根据构建的条件进行筛选
    // LIMIT和OFFSET用于实现分页功能
    const [courses] = await sql.query(
      `SELECT course_table.*, course_category.name as category_name, base_user.realname FROM course_table INNER JOIN course_category ON course_table.category_id = course_category.id INNER JOIN base_user ON course_table.teacher_id = base_user.id ${sqlStr} LIMIT ? OFFSET ?`,
      // 将条件片段的值和分页参数一起传递给SQL查询
      [...values, parseInt(pageSize, 10), parseInt(offset, 10)]
    );

    // 为了获取符合条件的课程总数，执行另一个SQL查询
    // 这个查询和获取课程列表的查询类似，但不包括LIMIT和OFFSET
    const [totalCount] = await sql.query(
      `SELECT count(*) as count FROM course_table INNER JOIN course_category ON course_table.category_id = course_category.id INNER JOIN base_user ON course_table.teacher_id = base_user.id ${sqlStr}`,
      values
    );
    // 从查询结果中获取总数
    const total = totalCount[0].count;

    // 如果查询成功，发送一个包含课程列表、总数、当前页和每页大小的响应
    res.send({
      status: 200,
      message: '获取成功',
      data: {
        list: courses, // 将查询到的课程列表赋值给list属性
        total: total,
        page: parseInt(page),
        pageSize: parseInt(pageSize)
      }
    });
  } catch (error) {
    // 如果在查询过程中发生错误，打印错误信息到控制台
    console.error('Error fetching courses:', error);
    // 发送一个包含错误信息的响应
    res.status(500).send({
      status: 500,
      message: '课程查询错误',
      data: null
    });
  }
});

// 获取单个课程内容
router.get('/detail', async (req, res) => {
  // 从请求的 URL 参数中获取课程 ID
  const { id } = req.query;
  try {
    // 执行 SQL 查询，获取单个课程的详细信息
    const [response] = await sql.query('SELECT * FROM course_table WHERE id = ?', [id]);
    console.log(response);

    // 检查是否找到课程
    if (response.length === 0) {
      // 如果没有找到课程，发送 404 响应
      res.send(new Response(404, '课程未找到', null));
    } else {
      // 如果找到课程，发送 200 响应，并将课程信息作为数据返回
      res.send(new Response(200, '查询成功', response[0]));
    }
  } catch (error) {
    // 如果查询过程中出现错误，发送 500 响应
    console.error(error);
    res.send(new Response(500, '服务器错误', null));
  }
});

router.post('/changeStatus', async (req, res) => {
  const { id, status } = req.body;
  const validStatuses = ['待评价', '评价中'];
  console.log(validStatuses);

  if (!validStatuses.includes(status)) {
    return res.send(new Response(400, '无效状态', null));

  }
  const newStatus = status === '待评价' ? '评价中' : '待评价';
  try {
    await sql.query('UPDATE course_table SET status=? WHERE id=?', [newStatus, id]);
    res.send(new Response(200, '切换成功', null));
  } catch (error) {
    res.send(new Response(500, error, null));
  }
});

// 删除数据的接口
router.get('/deleteById', async (req, res) => {
  const { id } = req.query;
  try {
    // 使用连接池执行查询
    await sql.query('DELETE FROM course_table WHERE id = ?', [id]);
    // 返回成功响应
    res.send(new Response(200, '删除成功', null))
  } catch (error) {
    // 处理可能的错误
    res.send(new Response(500, '删除失败', null))
  }
});



router.post('/saveOrUpdate', async (req, res) => {
  const { id, name, category_id, teacher_id, description, url, status, publish_time, issuer } = req.body;
  try {
    if (id) {
      // 如果id存在，执行更新操作
      const updateQuery = `
        UPDATE course_table
        SET name = ?, category_id = ?, teacher_id = ?, description = ?, url = ?, status = ?, publish_time = ?, issuer = ?
        WHERE id = ?
      `;
      await sql.query(updateQuery, [name, category_id, teacher_id, description, url, status, publish_time, issuer, id]);
      res.send(new Response(200, '课程更新成功', null));
    } else {
      // 如果id不存在，执行插入操作
      const insertQuery = `
        INSERT INTO course_table (name, category_id, teacher_id, description, url, status, publish_time, issuer)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?)
      `;
      await sql.query(insertQuery, [name, category_id, teacher_id, description, url, status, publish_time, issuer]);
      res.send(new Response(200, '课程添加成功', null));
    }
  } catch (error) {
    console.error('数据库操作失败:', error);
    res.send(new Response(500, '课程保存或更新失败', error));
  }
});


router.post('/updateCourseReviewTag', async (req, res) => {
  const { id, tag } = req.body;

  if (!id || !tag) {
    return res.status(400).send(new Response(400, '缺少必要的参数', null));
  }

  try {
    const [existingRecords] = await sql.query('SELECT * FROM course_review WHERE id = ?', [id]);

    if (existingRecords.length > 0) {
      await sql.query('UPDATE course_review SET tag = ? WHERE id = ?', [tag, id]);
      res.status(200).send(new Response(200, '更新成功', null));
    } else {
      await sql.query('INSERT INTO course_review (id, tag) VALUES (?, ?)', [id, tag]);
      res.status(200).send(new Response(200, '添加成功', null));
    }
  } catch (error) {
    console.error('数据库操作失败:', error);
    res.status(500).send(new Response(500, '操作失败', null));
  }
});

module.exports = router;
